# include "stdio.h"
# include "ctype.h"

#	define NS 5
	struct sf {
		char *text;
		int olap;
		} sents[NS];
	struct sf *sp;
	char stext[NS][500];

describe (file, argc, argv, rf)
	char *file, *argv[];
	FILE *rf;
{
	int ns 0;
	char linbuf[512], *line, *p;
	int i, wrflg 0, wrote 0, ln 0;
	FILE *fi;
fi = fopen(file, "r");
if (fi==NULL) return;
for(i=1; i<argc; i++)
	lcase(argv[i]);
while (gsent(linbuf, 512, fi))
	{
	wrote=0;
	for(line=linbuf; *line==' '; line++);
	if (line[0]==0) continue;
	for(p=line; *p; p++)
		if (*p=='\t') *p= ' ';
	if (wrflg && line[0]=='.' && isupper(line[1]))
		wrflg=0;
	if (wrflg)
		{
		output(line, ln, rf);
		wrote=1;
		}
	if (prefix(".TL", line))
		wrflg=1;
	if (prefix(".AU", line))
		wrflg = ln = 1;
	if (prefix(".DA", line) || prefix(".ND", line))
		output(line+4, 1, rf);
	if (line[0]=='.')
		continue;
	if (wrote) continue;
	ns=update(ns, line, count(line,argc,argv));
	}
fclose(fi);
for(sp=sents; sp<sents+ns; sp++)
	output(sp->text, 0, rf);
}

int state 0;
int oldc '\n';
gsent(buf, bsize, fi)
	char *buf;
	FILE *fi;
{
	char *s;
	int c, leng 0;
/* state
	0: looking for '.' 
	1: looking for nl or space aftter '.'
	2: looking for nl after line with dot.
	*/
s=buf;
if (state==2)
	*s++='.';
while ( (c = getc(fi)) > 0 )
	{
	switch(state)
		{
		case 0: /* normal */
			if (c=='.' && oldc == '\n')
				{
				*s=0;
				state=2;
				oldc='\n';
				return(1);
				}
			*s++ = (c=='\n'? ' ': c);
			if (s>=buf+bsize)
				{
				*--s = 0;
				return(1);
				}
			if (c=='.' || c == '?' || c=='!')
				if (leng>1)
					state=1;
			leng = (isalpha(c) ? leng+1 : 0);
			break;
		case 1: /* found ., want nl or space */
			if (c==' ' || c == '\n')
				{
				*s=0;
				state=0;
				oldc=c;
				return(1);
				}
			*s++ = (c=='\n' ? ' ' : c);
			state=0;
			leng = 0;
			break;
		case 2: /* found trof line, want nl */
			if (c == '\n')
				{
				*s=0;
				state=0;
				oldc='\n';
				return(1);
				}
			*s++ = c;
			break;
		}
	oldc=c;
	}
*s=0;
return(0);
}
prefix( p, s)
	char *p, *s;
{
int c;
while ( (c= *p++) == *s++)
	if (c==0)
		return(1);
return(c==0);
}
output (s, ln, rf)
	char *s;
	FILE *rf;
{
	char *t;
	int more 1;
	t=s;
	while (more)
		{
		while (t<s+72 && *t)
			t++;
		if (*t)
			{
			while (*t != ' ' && t>(s+25))
				t--;
			*t=0;
			more=1;
			}
		else
			more=0;
		printf("%s%s\n",ln++ ? "     " : "   ", s);
		if (rf!=NULL)
			fprintf(rf, "%s\n", s);
		s= ++t;
		}
}
count(isent, nw, wds)
	char *wds[], *isent;
{
int saw[50], ct;
char sb[512], *s sb;
int i, c;
for(i=1; i<nw; i++)
	saw[i]=0;
while (c = *isent++)
	{
	*s++ = isupper(c) ? tolower(c) : c;
	}
*s=0;
s=sb;
while (*s++)
	{
	if (s[-1]!=' ') continue;
	for(i=1; i<nw; i++)
		{
		if (saw[i])continue;
		if (prefix(wds[i], s))
			saw[i]=1;
		}
	}
ct=0;
for(i=1; i<nw; i++)
	if (saw[i])
		ct++;
return(ct);
}
lcase(s)
	char *s;
{
	register int c;
for(; c= *s; s++)
	{
	if (isupper(c))
		*s= tolower(c);
	}
}
update( ns, line, kov)
	char *line;
{
/* see if sentence array should be updated */
int lval 100; char *ob;
struct sf *sp, *least NULL;
if (kov<=0) return (ns) ; /* no*/
if (ns<NS)
	{
	sp=sents+ns;
	strcpy (sp->text = stext[ns], line);
	sp->olap = kov;
	return(ns+1);
	}
for(sp=sents+ns-1; sp>=sents; sp--)
	{
	if (sp->olap < lval)
		{
		least = sp;
		lval = sp->olap;
		}
	}
if (kov <= lval) return(ns);
ob = least->text;
while (++least < sents+NS)
	{
	(least-1)->text = least->text;
	(least-1)->olap = least->olap;
	}
sp = sents+NS-1;
strcpy (sp->text=ob, line);
sp->olap = kov;
return(NS);
}
